44
תגובות

עבודה עם OOP

פתח nirbe ,
שלום,
אני עדיין לא הצלחתי להבין למה עדיף לעבוד עם OOP גם לאחר שקראתי המון המון מדריכים בנושא.
הבנתי רק שעדיף להשתמש ב OOP בשביל MYSQL כדי שאם אי פעם אני ארצה לעבור מ MYSQL רגיל ו MYSQLI היה לי קל יותר.
אבל במערכת משתמשים, מה יקל עלי אם אני אעבוד עם OOP? יש לכם דוגמא של דברים שאתם עושים עם OOP ותוכלו להסביר לי למה עדיף להשתמש בזה ואיך משתמשים בזה במערכות משתמשים וכו..

תודה!

44 תשובות

avatar ענה razand ב 21 ליוני 2012 #

אם יהיה לך קוד ארוך
ותיהיה שגיאה הוא ם יגיד לך באיזה מחלקה זה.

וגם הקוד ניראה יותר מסודר וגם אנשים יוכלו להמסיך את עובדתך

avatar ענה raslin ב 21 ליוני 2012 #

אתה יכול לראות את המדריך הבא:
http://phpguide.co.il/OOP+%D7%AA%D7%9B%D7%A0%D7%95%D7%AA+%D7%9E%D7%95%D7%A0%D7%97%D7%94+%D7%A2%D7%A6%D7%9E%D7%99%D7%9D+%D7%9E%D7%91%D7%95%D7%90.htm

מקווה שאחריו תבין

avatar ענה nirbe ב 21 ליוני 2012 #

razand, לא ענית על השאלה שלי ממש.
raslin, ראיתי את המדריך הזה, לא הבנתי מה זה נותן לי עדיין, כמו שאמרתי, יהיה לכם אפילו קשה לתת לי מדריך שלא קראתי (במיוחד בעברית).

avatar ענה cthulhu ב 21 ליוני 2012 #

פשוט תמשיך לעבוד בלי oop, תבנה מערכות גדולות ותסתבך.
כשאתה מייצג עצם באתר שלך, כמחלקה, אתה יכול להקל על מי שקורא את הקוד שלך, וגם מבחינה לוגית הקוד שלך יהפוך למובן יותר. שלא נדבר על כך שזה מקצר לך את הקוד ולעיתים תראה שהקוד יהיה יותר יעיל אם תעבוד ב-oop.
אתה יכול טכנית לבנות פונקציה של שליחת הודעה. אבל "שליחת הודעה" זאת פעולה שבן אדם עושה. עדיף ליצור אובייקט של אדם ולהפעיל ממנו את המתודה הזאת, מאשר ליצור פעולה ולהפעיל על הנתונים. יש לנו מזל שהעולם עובד ככה ולא אחרת, וכדאי להתחיל ליישם את הפרדיגמה הזאת גם בקוד.

avatar ענה nirbe ב 21 ליוני 2012 #

כבר בניתי מערכות גדולות ומסובכות בלי OOP, אבל עכשיו אני מנסה למצוא לו שימוש, למשל ל SQL ולפעול כמו INSERT, שיהיה קל יותר.
האם יש לכם דוגמא מהמערכות שלכם לאיך אתם משתמשים ב OOP?

avatar ענה cthulhu ב 21 ליוני 2012 #

לא אמרתי שזה בלתי אפשרי, אמרתי שהקוד שלך יהיה גרוע ויהיה קשה לתחזק אותו. אם תתן לנו לצפות בקוד הזה, מבטיח לך ב-100% שניצחק ממנו.
ואם הדוגמא היחידה לשימוש ב-oop שאתה מכיר זה wrapper למסד נתונים, אז אני משתתף בצערך. למה מה הבעיה לבנות פונקציות של שליפה ומחיקה והתחברות ללא oop כמו שאתה עושה במקרים אחרים? קשה?
כל הפעולות שהמשתמש יכול לעשות באתר שלך - צריך לדחוף אותם לאובייקט של משתמש. פרטים אודות המשתמש צריכים להיות כתכונות של מחלקת המשתמש (properties). הנה לך עוד שימוש.

avatar ענה nirbe ב 21 ליוני 2012 #

אני חושב שהבנתי, נגיד להכניס את המשתמש לתוך CLASS (לפי ה ID שלו) וככה אפשר לשלוף מידע.
במקום בקובץ config שבו אני משתמש ב SQL כדי לשלוף ומכניס למשתנה, אז להשתמש ב CLASS ובתכונות כדי לשלוף את הפרטים עליו.
יש לך עוד דוגמאות?

avatar ענה cthulhu ב 21 ליוני 2012 #

כל אובייקט באתר ניתן להציגו בתור מחלקה. כאן, ב-phpguide אני כמעט בטוח ששאלה זה אובייקט נפרד ותשובה זה אובייקט נפרד (אולי הם יורשים מאובייקט פוסט כלשהו שהרי גם לשאלה וגם לתשובה יש מאפיינים זהים כמו מחבר השאלה/תשובה, תראיך וכדומה) - מבלי להסתכל בקוד.

avatar ענה raslin ב 21 ליוני 2012 #

מדובר פה על תורה שלמה,
אני מבין אותך כי הייתי בנקודה הזו (מזמן!!)
והיום אני לא חושב בכלל לבנות משהו בלי זה,

לדעתי תתחיל לבנות עם שימוש במחלקות,
תנסה להשתמש בפריימוורק כלשהו אולי,
ולאט לאט תבין שזה מקל על העניינים, ומשם תתקדם

avatar ענה nirbe ב 21 ליוני 2012 #

מה שאני אמרתי נכון?\
ליצור CLASS שמקבל ID של המשתמש ואז להכניס את הפרטים של אותו המשתמש וככה גם להציג אותם ולבצע כל מני פעולות ופונקציות של משתמש, האם זה אחד מהאפשרויות שכדאי להשתמש בהם ה OOP?

avatar ענה razand ב 21 ליוני 2012 #

גם אפשרות

avatar ענה nirbe ב 21 ליוני 2012 #

אשמח אם תספרו לי מה אתם עושים עם OOP וככה אני אצליח להבין יותר טוב.

avatar ענה intval ב 21 ליוני 2012 #

בערך הכל.

avatar ענה nirbe ב 21 ליוני 2012 #

מה בערך הכל?
יש לך דומגאות איך אתה משתמש ב OOP?

avatar ענה intval ב 21 ליוני 2012 #

בערך הכל זה אומר שהקוד היחידי ב phpguide שלא שייך למחלקה כלשהי זה index.php שגם בו יש בסה"כ משהו כמו

new router()->start()

שאגב האתר בקוד פתוח, אתה יכול לקחת ולראות את הקוד לבד.

דוגמאות? בבקשה. כתבת תגובה? זה מופע של "תגובה" שיש לה מאפיינים כמו "מחבר" ו"טקסט"
ופעולות של "למחוק" ו"לשנות טקסט".

avatar ענה raslin ב 21 ליוני 2012 #

אני בניתי משחק דפדפן,
מאות מחלקות,
הכל OOP בלבד.

בלי זה היה קשה בהרבה להתמודד עם הסיבוך

avatar ענה nirbe ב 21 ליוני 2012 #

אוקיי, תודה intval, אני מקווה שהבנתי, אם לא תתקן אותי.
מופע - class
מאפיינים זה מה שמכניסים ב class למשל:

class bla{
 public $bla;
}


והפעולות אלה הפונקציות שב class?

avatar ענה nirbe ב 21 ליוני 2012 #

אני צריך תשובות כמה שיותר מהר כי עוד החופש יש לי פרוייקט ענק ואני רוצה לנסות להקל עליו עם OOP, תודה :)

avatar ענה iiddaannyy ב 21 ליוני 2012 #

כמעט נכון.
מופע הוא ה-instance של ה-class:

$a = new bla;
$b = new bla;

כאן יש שני מופעים של המחלקה bla.

avatar ענה nirbe ב 22 ליוני 2012 #

class - עצמים ב php?
מופע - יצירת ה class
מאפיינים/תכונות - משתנים שנמצאים ב class
פונקציות/מתודות - פונקציות שנמצאות ב class

למשל אם אני רוצה ליצור מערכת תגובות, אני יוצר את class לתגובות נותן לו מאפיינים של: יוצר התגובה, תאריך, שעה וכו...
הפונקציות של ה class זה: פרסום התגובה, עריכת התגובה, מחיקת התגובה וכו...
ואחר כך אני פשוט קורא לפונקציות האלה מתוך ה class וזהו?

אני מקווה שהבנתי את זה נכון, זה נראה לי באמת מקל על העבודה ומסדר אותה.

avatar ענה iiddaannyy ב 22 ליוני 2012 #

הבנת נכון.

avatar ענה nirbe ב 22 ליוני 2012 #

אוקיי, מצויין.
ונגיד אני רוצה class למשתמש. אז ה class הזה גם להרשמה שלו, גם להתחברות, גם להגדרות וגם לכל פעולה שהוא יכול לעשות?

avatar ענה Plural ב 22 ליוני 2012 #

לא לא לא, זה לא נכון.
class זה לא עצם! אלה דברים שונים.
קלאס (מחלקה) הוא מבנה סטטי. הוא "חי" בכל הזמן שהסקריפט עדיין רץ.
עצם (מהתפתחות ה-OOP) נחשב כפשוט מופע חדש של המחלקה (כלומר, זהה ל-instance).

עריכה:
דרך אגב, מופע זה לא "יצירת הclass".

avatar ענה nirbe ב 22 ליוני 2012 #

אוקיי, ובקשר לתגובה הקודמת, אני צודק?

avatar ענה iiddaannyy ב 22 ליוני 2012 #

Plural צודק, לא דייקתי.


בקשר לתגובה הקודמת:
ה-class יכיל מה שתקבע לו. המחלקה user אמורה להכיל דברים שהמשתמש יכול לבצע ומאפיינים של המשתמש.

avatar ענה nirbe ב 22 ליוני 2012 #

הדברים שהמשתמש יכול לבצע לא כולל הרשמה או כן כולל? איך אתם עושים את זה?
מה למשל אתם שמים במתודות של המשתמש?

avatar ענה nirbe ב 24 ליוני 2012 #

מישהו? זה ממש חשוב לי ליומיים הקרובים.

avatar ענה nirbe ב 24 ליוני 2012 #

אני צריך תשובה עד יום שלישי, תודה :)

avatar ענה intval ב 24 ליוני 2012 #

תחליט לבד מה לשים בכל מקום.
במשתמש אתה יכול לשים פעולות כמו עדכונים של דברים
עדכןשם, עדכן אימייל, עדכן סיסמה, מחק
ולהישתמש במחלקה הזאת בתור פרמטר למחלקות אחרות כמו "הזדהות" "הודעות פרטיות" וכו

avatar ענה nirbe ב 24 ליוני 2012 #

אוקי תודה רבה!
ומה זה אומר פרמטר למחלקות אחרות? לא ממש הבנתי את זה.

avatar ענה iiddaannyy ב 24 ליוני 2012 #

משהו כזה:

class privateMsg {
    public function send(user $user) {
        // send...
    }
}
$msg = new privateMsg;
$msg->send(new user($id));

שלחתי למתודה send את ה-instance (מופע) של המחלקה user.

שים לב שבכותרת המתודה send, כשהגדרתי פרמטר $user, רשמתי לפניו את המילה user שאומרת שהפרמטר שמתקבל צריך להיות Instance של המחלקה user. אם תשלח משהו אחר תקבל שגיאה.
לדבר הזה קוראים type hinting והוא זמין מגירסה 5.1.

avatar ענה nirbe ב 25 ליוני 2012 #

אוקיי.
ה user הראשון הוא קריאה למופע של user ומשתנה user הוא המתשנה של המופע user?

avatar ענה raslin ב 25 ליוני 2012 #

ה user הראשון זו רק הגדרה לכך שהמשתנה שהפונקציה מוכנה לקבל זה משתנה מסוג (מחלקה) user
(בלי קשר, כאשר מדובר במחלקה רצוי (מאוד!) לכתוב עם אות גדולה (User)

avatar ענה nirbe ב 25 ליוני 2012 #

ומה זה בדיוק נותן לי?

avatar ענה Y_Y ב 25 ליוני 2012 #

עשר פעולות שיעזרו לך:

1.קח דף ועט

2.צייר ריבועים

3.צייר משתמש

4.תרשום מה אתה רוצה שהוא יוכל לעשות במערכת/אתר/web service

5.תחלק את כל אחד מהפעולות לפי מכנה משותף לריבועים

5.1.יוכל לפרסם דברים? אז נכניס את זה לפעולות של היוזר וכו'

6.תעבור על כל הריבועים תראה אם יש פעולות דומות שפספת והם לא באותו ריבוע

7.סדר הכל מחדש

8.תעביר חצים מהבן אדם לריבועים ולפי הפעולות שיוכל לבצע ואיזה ערך נכנס ומה חוזר

8.1.משתמש->קלט[ריבוע של קלט(סינון XSS וכו)]->הרשמה[ריבוע של רישום](מעביר שם וסיסמא)->ביצוע בDB[ריבוע של דטהבייס](מחזיר מחרוזת חיבור?) ->פלט[ריבוע של פלט]

9.ברגע שיש לך סקיצה עם חצים וריבועים אתה יכול להתחיל לבנות משהו והכל ילך יותר חלק

10.כנס שוב לפה תשאל למה לא עובד???

:)

avatar ענה nirbe ב 25 ליוני 2012 #

נתקעתי ב 8, מז"א, ערך נכנס ויוצא, נגיד אני עושה קניית חיילים, אז הערך הוא ה ID של החייל ומה שיוצא זה ההוספה של החיילים למשתמש?

avatar ענה Y_Y ב 25 ליוני 2012 #

נגיד עכשיו אני עושה פונקציה שתתן לי את שם המשתמש

אז מה שאני מעביר לפונקציה יהיה הID ומה שאני אקבל זה השם משתמש.. לזה התכוונתי

avatar ענה nirbe ב 25 ליוני 2012 #

אוקיי,
לא הבנתי את הדוגמא של 8.1, תוכל להסביר לי אותה?

avatar ענה Y_Y ב 25 ליוני 2012 #

הכוונה היא מה קורה שמשתשמש עושה לוגין:
אז לדוגמא כל התהליך עד הרישום במסד הנתונים:

משתמש מזין שם משתמש וסיסמא->קבלת שם משתמש וסיסמא->סינון תווים בעייתיםXSS->בדיקה האם קיים כבר השם משתמש->רישום בDB ..

אז זאת אומרת במה אנחנו משתמשים עכשיו באיזה מחלקות אז:

קלט->סינון(בתוך קלט)->בדיקה(בתוך מחלקת רישום)->רישום(בתוך מחלקת רישום)

אז העיניין בשלב התכנון של הריבועים לוודא שאין משהו שהולך הלוך חזור בצורה לא יעילה

avatar ענה nirbe ב 25 ליוני 2012 #

מז"א סינון בתוך קלט?, הבנתי את הכל חוץ מזה.
תודה לך :)

avatar ענה raslin ב 25 ליוני 2012 #

אני אנסה לקצר לשלב 1,
תפרק את המחלקות כאילו מדובר בעולם אמיתי,
תחשוב על מאפיינים בעולם האמיתי של האובייקט שלך, וככה תדע מה התכונות ומה הפונקציות,

לדוגמא, אם זה משתמש שצריך לכתוב תגובה כלשהי,

אז הייתי יותר משתמש, עם פונקציה שיודעת לכתוב ,
ומה שהפונקציה מקבלת, זה אובייקט של תגובה,
שלאותו אובייקט יש מאפיינים של תגובה...

כמו בני אדם, שיודעים לכתוב, בשביל זה הם צריכים דף ועט,
ומה המאפיינים בדף? זה שאלון? מבחן? מה התוכן שלו?

God!!

avatar ענה nirbe ב 26 ליוני 2012 #

מה הכוונה באובייקט?

avatar ענה raslin ב 26 ליוני 2012 #

מופע..
או instance אותו דבר

avatar ענה nirbe ב 26 ליוני 2012 #

אוקיי, אם יהיה לי עוד שאלה, אני אשאל פה.